﻿/*
Nombre:                         Accion
Descripcion:                    Clase que permite la aplicacion del patron comando ejecutando todas las operaciones hacia base de datos
                                de forma generica
Dependencias:                 
Fecha de creación:              20090209
Autor:                          VMORALES
Fecha de modifcación:         
Responsable:                  
Num. de modifcación:            0
*/

#region Imports

using System;
using System.Reflection;
using Common.Logging;
using System.Text;

#endregion

namespace Electrocucaracha.AdminPersonal.DAO.Acciones
{
    public delegate void EjecutarDelegate();
    public class Accion : IAccion
    {
        #region Constantes

        public readonly static string OUTPUT = "output";
        public readonly static string INPUT = "input";

        #endregion

        #region Miembros

        protected string nombreClase = "Accion";
        protected DiccionarioParametros parametros;
        private EjecutarDelegate ejecutar;
        private static readonly ILog LOG = LogManager.GetLogger(typeof(Accion));
        protected LogLevel logLevel;

        #endregion

        #region Propiedades

        public DiccionarioParametros Parametros
        {
            set { parametros = value; }
            get { return parametros; }
        }//Parametros

        #endregion

        #region Constructores

        public Accion()
        {
            this.parametros = new DiccionarioParametros();
        }//Accion

        public Accion(IAccion accion):this()
        {
            ejecutar = accion.Ejecutar;
        }//Accion

        #endregion

        # region Funciones

        /// <summary>
        /// Metodo que permite la ejecucion previa de comandos
        /// </summary>
        public virtual void preEjecutar()
        {
            if (LOG.IsDebugEnabled && this.logLevel.Equals(LogLevel.Debug))
            {
                StringBuilder msg = new StringBuilder(this.nombreClase);

                Object input = this.parametros.ContainsKey(INPUT) ? this.Parametros[INPUT] : null;
                if(input != null){
                    msg.AppendLine("\nthis.Parametros[INPUT]");
                    foreach (PropertyInfo propiedad in input.GetType().GetProperties())
                    {
                        if (!propiedad.PropertyType.Namespace.Equals("System.Data.Linq"))
                        {
                            msg.AppendLine("\t" + propiedad.Name + " : " + propiedad.GetValue(input, null));
                        }
                    }
                }
                
                Object output = this.parametros.ContainsKey(OUTPUT) ? this.Parametros[OUTPUT] : null;
                if (output != null)
                {
                    msg.AppendLine("\nthis.Parametros[OUTPUT]");
                    foreach (PropertyInfo propiedad in output.GetType().GetProperties())
                    {
                        if (!propiedad.PropertyType.Namespace.Equals("System.Data.Linq"))
                        {
                            msg.AppendLine("\t" + propiedad.Name + " : " + propiedad.GetValue(output, null));
                        }
                    }
                }
                LOG.Debug(msg);
            }
        }//preEjecutar

        /// <summary>
        /// Metodo que contiene todos los comandos a relizar sobre la base de datos
        /// </summary>
        public virtual void Ejecutar()
        {
            if (ejecutar != null)
            {
                ejecutar.Invoke();
            }
        }

        /// <summary>
        /// Metodo que permite la ejecucion tardia de comandos
        /// </summary>
        public virtual void postEjecutar()
        {
            if (LOG.IsDebugEnabled && this.logLevel.Equals(LogLevel.Debug))
            {
                StringBuilder msg = new StringBuilder(this.nombreClase);

                Object input = this.parametros.ContainsKey(INPUT) ? this.Parametros[INPUT] : null;
                if (input != null)
                {
                    msg.AppendLine("\nthis.Parametros[INPUT]");
                    foreach (PropertyInfo propiedad in input.GetType().GetProperties())
                    {
                        if (!propiedad.PropertyType.Namespace.Equals("System.Data.Linq"))
                        {
                            msg.AppendLine("\t" + propiedad.Name + " : " + propiedad.GetValue(input, null));
                        }
                    }
                }

                Object output = this.parametros.ContainsKey(OUTPUT) ? this.Parametros[OUTPUT] : null;
                if (output != null)
                {
                    msg.AppendLine("\nthis.Parametros[OUTPUT]");
                    foreach (PropertyInfo propiedad in output.GetType().GetProperties())
                    {
                        if (!propiedad.PropertyType.Namespace.Equals("System.Data.Linq"))
                        {
                            msg.AppendLine("\t" + propiedad.Name + " : " + propiedad.GetValue(output, null));
                        }
                    }
                }
                LOG.Debug(msg);
            }
        }//postEjecutar

        #endregion
    }//Accion
}//Electrocucaracha.AdminPersonal.DAO.Acciones